home *** CD-ROM | disk | FTP | other *** search
- Program PYTHAGOREAN_TRIPLES;
- {written by Mark Lewis, April 1, 1990}
- {developed and written in Turbo Pascal v3.0}
-
- Const
- hicnt = 100;
- ZERO = 0;
-
- Type
- PythagPtr = ^PythagRec; {Pointer to find the Record}
- PythagRec = Record {the Record we are storing}
- A : Real;
- B : Real;
- C : Real;
- total : Real;
- next : PythagPtr {Pointer to next Record in line}
- end;
-
- Var
- Root : PythagPtr; {the starting point}
- QUIT : Boolean;
- ch : Char;
-
- Procedure listdispose(Var root : pythagptr);
-
- Var
- holder : pythagptr;
-
- begin
- if root <> nil then {if we have Records in the list}
- Repeat {...}
- holder := root^.next; {save location of next Record}
- dispose(root); {remove this Record}
- root := holder; {go to next Record}
- Until root = nil; {Until they are all gone}
- end;
-
- Procedure findpythag(Var root : pythagptr);
- Var
- x,y,z,stored : Integer;
- xy,zz,xx,yy : Real;
- abandon : Boolean;
- workrec : pythagrec;
- last,current : pythagptr;
-
- begin
- stored := zero; {init count at ZERO}
- For z := 1 to hicnt do {start loop 3}
- begin
- zz := sqr(z); {square loop counter}
- if zz < zero then
- zz := 65536.0 + zz; {twiddle For negatives}
- For y := 1 to hicnt do {start loop 2}
- begin
- yy := sqr(y); {square loop counter}
- if yy < zero then
- yy := 65536.0 + yy; {twiddle For negatives}
- For x := 1 to hicnt do {start loop 1}
- begin
- abandon := False; {keep this one}
- xx := sqr(x); {square loop counter}
- xy := xx + yy; {add sqr(loop2) and sqr(loop1)}
- if not ((xy <> zz) or ((xy = zz) and (xy = 1.0))) then
- begin
- With workrec do
- begin
- a := x; {put them into our storage Record}
- b := y;
- c := z;
- total := zz;
- end;
- if root = nil then {is this the first Record?}
- begin
- new(root); {allocate space}
- workrec.next := nil; {anchor the Record}
- root^ := workrec; {store it}
- stored := succ(stored); {how many found?}
- end
- else {this is not the first Record}
- begin
- current := root; {save where we are now}
- Repeat {walk Records looking For dups}
- if (current^.total = workrec.total) then
- abandon := True; {is this one a dup?}{abandon it}
- last := current; {save where we are}
- current := current^.next {go to next Record}
- Until (current = nil) or abandon;
- if not abandon then {save this one?}
- begin
- {we're going to INSERT this Record into the}
- {line between the ones greater than and less}
- {than the A Var in the Record}
- {ie: 5,12,13 goes between 3,4,5 and 6,8,10}
- if root^.a > workrec.a then
- begin
- new(root); {allocate mem For this one}
- workrec.next := last; {point to next rec}
- root^ := workrec; {save this one}
- stored := succ(stored); {how many found?}
- end
- else {insert between last^.next and current}
- begin
- new(last^.next); {allocate memory}
- workrec.next := current; {point to current}
- last^.next^ := workrec; {save this one}
- stored := succ(stored); {how many found?}
- end;
- end;
- end;
- end;
- end;
- end;
- end;
- Writeln('I have found and stored ',stored,' Pythagorean Triples.');
- end;
-
- Procedure showRecord(workrec : pythagrec);
-
- begin
- With workrec do
- begin
- Writeln('A = ',a:6:0,' ',sqr(a):6:0);
- Writeln('B = ',b:6:0,' ',sqr(b):6:0,' ',sqr(a)+sqr(b):6:0);
- Writeln('C = ',c:6:0,' ',sqr(c):6:0,' <-^');
- end
- end;
-
- Procedure viewlist(root : pythagptr);
-
- Var
- i : Integer;
- current : pythagptr;
-
- begin
- if root = nil then
- begin
- Writeln('<< Your list is empty! >>');
- Write('>> Press (CR) to continue: ');
- readln;
- end
- else
- begin
- Writeln('Viewing Records');
- current := root;
- While current <> nil do
- begin
- showRecord(current^);
- Write('Press (CR) to view next Record. . . ');
- readln;
- current := current^.next
- end;
- end
- end;
-
- begin
- Writeln('PYTHAGOREAN TRIPLES');
- Writeln('-------------------');
- Writeln;
- Writeln('Remember the formula For a Right Triangle?');
- Writeln('A squared + B squared = C squared');
- Writeln;
- Writeln('I call the set of numbers that fits this formula');
- Writeln(' Pythagorean Triples');
- Writeln;
- Writeln('This Program Uses a "brute force" method of finding all');
- Writeln('the Pythagorean Triples between 1 and 100');
- Writeln;
- root := nil;
- quit := False;
- Repeat
- Writeln('Command -> [F]ind, [V]iew, [D]ispose, [Q]uit ');
- readln(ch);
- Case ch of
- 'q','Q' : quit := True;
- 'f','F' : findpythag(root);
- 'v','V' : viewlist(root);
- 'd','D' : listdispose(root);
- end;
- Until quit;
- if root <> nil then
- listdispose(root);
- Writeln('Normal Program Termination');
- end.
-